<?
/*! \file
 *  \brief Contiene las funciones generales para capturar
 *  la informacion del webservice y enviar las alertas 
 *  necesarias al Administrador.
 *  \author Gustavo Borgoni (gborgoni@despegar.com)
 */

/* General parameters */
error_reporting(0);

/* includes */
include_once('libs/class.phpmailer.php');

/*! \brief Establece la conexion con un webservice para
 *  recuoerar la informacion del capturador
 *  \param $xml Nombre del archivo XML que debera buscar
 *  \param $ip Direccion IP del host
 *  \param $port Puerto donde se encuentra el webserver
 */
function get_info($xml,$ip,$pbx_num,$port = 80) {
	$url = "http://".$ip."/".$xml;
	$rxml = "";

	if ($fp = fsockopen($ip, $port, $errno, $errstr, 6)){
		fwrite($fp, "GET $url HTTP/1.0\r\n Host: $ip\r\n\r\n");
		$body = false;

		while (!feof($fp)) {
			$buffer = fgets($fp, 1024);
			if($body) $rxml .= $buffer;
			if($buffer == "\r\n") $body = true;
		}
		fclose($fp);

		echo $rxml;
		alarms($rxml,$pbx_num);
	}else{
		$xml  = "<conf>\n";
		$xml .= "	<aststatus>Link Down</aststatus>\n";
		$xml .= "	<descript>Error al intentar conectar con el host: ".$ip."</descript>\n";
		$xml .= "</conf>\n";

		echo $xml;
		alarms($xml,$pbx_num);
	}
}

/*! \brief Verifica el resultado XML, devuelto por el
 *  webservice, en busca de errores, para disparar las
 *  alarmas necesarias.
 *  \param $xml contenido XML devuelto por el webservice
 */
function alarms($xml,$pbx_num) {
	global  $mod_astdown, $mod_lnkdown, $mod_iaxms, $mod_spandown, 
		$mod_pbxrestarted, $mod_astrestarted, $mod_diskalert, $pbx;


	$parser = xml_parser_create();
	xml_parse_into_struct($parser,$xml,$values,$index);

	if ($mod_iaxms > 0) {

	}

	// Alertas de disco
	if ($mod_diskalert > 0) {
		if ($values[$index['DISK'][0]]['value'] >= $mod_diskalert) {
			if ($values[$index['DISK'][0]]['value'] >= 90){
				$level = 1;
			} elseif ($values[$index['DISK'][0]]['value'] >= 80) {
				$level = 2;
			} else {
				$level = 3;
			}

			$subject  = "Problemas de espacio en disco";
			$name     = $pbx[$pbx_num]['name'];
			$ip       = $pbx[$pbx_num]['ip'];

			$descript = "Se ha detectado un problema de espacio en disco<br><br>";
			$descript.= "Espacio utilizado: ".$values[$index['DISK'][0]]['value']."%<br><br>";

			$msg = start_html();
			$msg.= put_alert($subject,$name,$descript,$ip,$level);
			$msg.= close_html();

			file_write('/tmp/mail.html',$msg);

			mail_report($subject,'disk');
			return;
		}
	}

	// Alerta de asterisk down
	if ($mod_astdown == "yes") {
		if ($values[$index['ASTSTATUS'][0]]['value'] == "Down") {
			$subject = "Asterisk fuera de servicio";

			$msg = start_html();
			$msg.= "Asterisk no funciona!";
			$msg.= close_html();

			file_write('/tmp/mail.html',$msg);

			mail_report($subject,'aststatus');
			return;
		}
	}

	// Alerta de link down
	if ($mod_lnkdown == "yes") {
		if ($values[$index['ASTSTATUS'][0]]['value'] == "Link Down") {
			$subject = "Error de conexion";
			
			$msg = start_html();
			$msg.= $values[$index['DESCRIPT'][0]]['value'];
			$msg.= close_html();

			file_write('/tmp/mail.html',$msg);

			mail_report($subject,'link');
			return;
		}
	}
} // Alarms

/*! \brief envia una alarma por email
 *  \param $subject Asunto del correo 
 */
function mail_report($subject, $service) {
	global $mod_mailhost, $mod_mailfrom, $mod_mailto, $mod_subject, $modAlertFreq, $mod_name;

	$last = get_timestamp($service);
	$diff = time() - $last;

	if ($diff > ($modAlertFreq * 60) || $diff <= 0) {
		date_default_timezone_set('America/Buenos_Aires');

        	$mail = new PHPMailer();
        	$mail->IsSMTP();
        	$mail->Host = $mod_mailhost;
        	$mail->From = $mod_mailfrom;
        	$mail->FromName = $mod_name;

		$body = $mail->getFile('/tmp/mail.html');
		$body = eregi_replace("[\]",'',$body);

		$mail->Subject = $mod_subject." - ".$subject;
		$mail->AltBody = 'Habilite el HTML!';

		$mail->MsgHTML($body);
		$mail->AddAttachment("images/logo.jpg");

		$mail->AddAddress($mod_mailto, " ");

		save_timestamp($service);

        	if(!$mail->Send()) {
			write_log("Mailer Error: " . $mail->ErrorInfo);
        	}
	}
	return;
}

/*! \brief Escribe un dato en el archivo de log, utilizado para
 *  debuguear la aplicacion
 *  \param $msg texto a guardar en el archivo.
 */
function write_log($msg) {
	$fp = fopen("/tmp/log.all","a+");

	fwrite($fp, $msg);
	fclose($fp);
}

/*! \brief Guarda en un archivo temporal, la hora en que se envio
 *  la ultima alerta
 */
function save_timestamp($service) {
	$fp = fopen("/tmp/gb".$service,"w");

	fwrite($fp,time());
	fclose($fp);
}

/*! \brief Devuelve la hora que fue enviado la ultima alerta
 */
function get_timestamp($service) {
	if ($fp = fopen("/tmp/gb".$service,"r")) {

		while(!feof($fp)) {
			$buff = fgets($fp,1024);
		}
		fclose($fp);

		return $buff;
	} else {
		return 0;
	}
}

/*! \brief Escribe un archivo de texto plano
 *  \param $file ubicacion del archivo
 *  \param $txt contenido del archivo
 */
function file_write($file,$txt) {
	$fp = fopen($file,"w");
	fwrite($fp,$txt);
	fclose($fp);
}

/*! \brief Devuelve una cadena de texto con el codigo
 *  para iniciar un archivo HTML
 */
function start_html(){
	$html = "<html>";
	$html.= "<head><title>PBX Monitor Alert</title>\n";
	$html.= "<style type=\"text/css\">\n";
	$html.= "<!--\n";
	$html.= "body{font-family:tahoma}\n";
	$html.= "table{font-size:11px}\n";
	$html.= ".tbl_repo_critic{border: solid 1px #FF0000}";
	$html.= ".title_repo_critic{color: #990000; background-color: #FFA6A6; font-weight:bold}";
	$html.= ".td_repo_critic{border-bottom: solid 1px #FF0000}";

	$html.= ".tbl_repo_alert{border: solid 1px #FFFF33}";
	$html.= ".title_repo_alert{color: #FF9900; background-color: #FFFFCC; font-weight:bold}";
	$html.= ".td_repo_alert{border-bottom: solid 1px #FFFF33}";

	$html.= ".tbl_repo_info{border: solid 1px #333333}";
	$html.= ".title_repo_info{color: #999999; background-color: #EFEFEF; font-weight:bold}";
	$html.= ".td_repo_info{border-bottom: solid 1px #333333}";

	$html.= "-->";
	$html.= "</style>\n";
	$html.= "<body topmargin='0' leftmargin='0'>";
	$html.= "<img src='logo.jpg'><br>";

	return $html;
}

/*! \brief Devuelve una cadena de texto con el codigo para
 *  cerrar un archivo HTML
 */
function close_html() {
	$html = "</body>";
	$html.= "</html>";

	return $html;
}

/*! \brief Devuelve el codigo html de la alerta
 *  \param $title titulo de la alerta
 *  \param $pbx nombre del equipo
 *  \param $descript description de la alerta
 *  \param $ip direccion ip del equipo
 *  \param $level Nivel de la alerta, 1=crito, 2=alarma, 3=info
 */
function put_alert($title,$name,$descript,$ip,$level) {
	
	if ($level == 1) {
		$class = 'critic';
		$type  = "Critico";
	} elseif ($level == 2) {
		$class = 'alert';
		$type  = "Alert";
	} elseif ($level == 3) {
		$class = 'info';
		$type  = "Informe";
	}

	$html  = "<table width='400' border='0' cellpading='0' cellspacing='0' class='tbl_repo_".$class."' align='center'>\n";
	$html .= "<tr><td colspan='2' height='22' class='title_repo_".$class."' align='center'>".$title."</td></tr>\n";

	$html .= "<tr><td height='20' width='120' class='td_repo_".$class."' align='right'><strong>Nivel:</strong></td>\n";
	$html .= "<td align='left' class='td_repo_".$class."'>".$type."</td></tr>\n";

	$html .= "<tr><td height='20' width='120' class='td_repo_".$class."' align='right'><strong>Central:</strong></td>\n";
	$html .= "<td align='left' class='td_repo_".$class."'>".$name."</td></tr>\n";
	$html .= "<tr><td height='20' width='120' class='td_repo_".$class."' align='right'><strong>Direccion IP:</strong></td>\n";
	$html .= "<td align='left' class='td_repo_".$class."'>".$ip."</td></tr>\n";
	$html .= "<tr><td height='20' width='120' class='td_repo_".$class."' align='right'><strong>Fecha y hora:</strong></td>\n";
	$html .= "<td align='left' class='td_repo_".$class."'>".date("d-m-y h:i:s")."</td></tr>\n";
	$html .= "<tr><td colspan='2' height='22' class='title_repo_".$class."' align='center'>D E S C R I P C I O N</td></tr>\n";
	$html .= "<tr><td colspan='2' class='td_repo_".$class."'>".$descript."</td></tr>\n";
	$html .= "</table>\n";

	return $html;
}
?>
